package br.com.imob.dao;

import br.com.imob.modelo.Cidade;
import br.com.imob.modelo.Estado;

import java.util.List;



public class CidadeDao extends GenericDao {

    public CidadeDao() {}

    public Integer adicionarCidade(Cidade cidade) {
        if( cidade.getEstado() != null )
            cidade.setEstado( new EstadoDao().retriveEstado( cidade.getEstado() ) );

        saveOrUpdatePojo(cidade);
        return cidade.getCidadeId();
    }

    public void removerCidade(Cidade cidade) {
        removerPojo(cidade);
    }

    /* Precisa definir o ID */
    public void atualizarCidade(Cidade recupera) {
        saveOrUpdatePojo(recupera);
    }
    /* Precisa definir qual atribuito sera a chave a identificar
     * a tupla a ser alterada */

    
    /**
	 * Editar um Cidade
	 * @param String oldCidade
	 * @param String newCidade
	 */
	public void atualizarCidade(String oldCidade, String newCidade ) {
		if ( ( !"".equals(oldCidade) && oldCidade != null )
			&& ( !"".equals(newCidade) && newCidade != null ) ) 
			atualizarCidade( getCidadeQNamed(oldCidade), new Cidade(newCidade) );
	}
	
    
    public void atualizarCidade(Cidade recuperar, Cidade alterar) {
        recuperar = retriveCidade(recuperar);

        if (alterar.getCidade() != null) {
            recuperar.setCidade(alterar.getCidade());
        }

        saveOrUpdatePojo(recuperar);
    }

//	Artificio para Recuperar a Tupla de Cidade
    protected Cidade retriveCidade(Cidade recuperar) {
        if (recuperar.getCidadeId() == null) {
            recuperar = getCidadeQNamed(recuperar.getCidade());
        } else {
            recuperar = getCidade(recuperar.getCidadeId());
        }
        return recuperar;
    }

//	Consultas
    public Cidade getCidade(Integer key) {
        return getPojoByID(Cidade.class, key);
    }

    public Cidade getCidadeByQuery(String query, Object... params) {
        return getPojoByQry(query, params);
    }

    public Cidade getCidadeQNamed(String fltrCidade) {
        return getPojoByQNamed("Cidade.findByCidade", fltrCidade);
    }

    public List<Cidade> getCidades() {
        return (List<Cidade>) getALL(Cidade.class);
    }

    public List<Cidade> getCidadesQNamedPRX(String fltrCidade) {
        return getListByQNamedPRX("Cidade.findLikeByCidade", fltrCidade);
    }

    public List<Cidade> getCidadesQryByUf(String fltrUf) {
        Estado e = new EstadoDao().getEstadoQNamedUf(fltrUf);

        String qry = "FROM Cidade c WHERE c.estado = "+e.getEstadoId();

        return getCidadesByQuery( qry );
    }

    public List<Cidade> getCidadesQryByUfCidade(String fltrUf, String fltrCidade) {
        Estado e = new EstadoDao().getEstadoQNamedUf(fltrUf);

        String qry = "FROM Cidade c WHERE c.estado = "+e.getEstadoId()
                +" AND c.cidade like '%"+fltrCidade+"%'";

        return getCidadesByQuery( qry );
    }


    public List<Cidade> getCidadesByQuery(String query, Object... params) {
        return getListByQry(query, params);
    }
}
